package business;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import utils.HibernateUtil;

import entities.Persoon;
import entities.Rol;
import entities.Medewerker;
import exceptions.NoEntityException;

public class MedewerkerAanmaker extends PersoonAanmaker
{
	private Set<Rol> rollen;
	
	// Constructors
	
	public MedewerkerAanmaker(String naam, String voornaam, Date geboortedatum, String rekeningnummer, String gebruikersnaam, String inlogcode, int bsn)
	{
		super(naam, voornaam, geboortedatum, rekeningnummer, gebruikersnaam, inlogcode, bsn);
		setRollen(new HashSet<Rol>());
	}
	
	// Getters en Setters
	public Set<Rol> getRollen()
	{
		return rollen;
	}
	public void setRollen(Set<Rol> rollen)
	{
		this.rollen = rollen;
	}
	
	// Methoden
	
	@Override
	public Persoon createEntity()
	{
		persoon = new Medewerker(naam, voornaam, geboortedatum,rekeningnummer, gebruikersnaam, inlogcode, bsn);
		persoon.setTussenvoegsel(tussenvoegsel);
		persoon.setPostcode(postcode);
		persoon.setTelefoonnummer(telefoonnummer);
		persoon.setEmail(email);
		
		((Medewerker)persoon).setRollen(rollen);
		
		return persoon;
	}

	@Override
	public boolean saveEntity()
	{
		try
		{
			if(persoon == null)
			{
				throw new NoEntityException();
			}
		}
		catch(NoEntityException e)
		{
			e.printStackTrace();
			return false;
		}
		
		Session session = null;
		Transaction tx = null;
		
		boolean saved = true;
		
		try
		{
			// get a session
			session = HibernateUtil.getSessionFactory().openSession();
			
			// Start a tx
			tx = session.beginTransaction();
			
			session.save((Medewerker)persoon);
			
			// Commit the changes
			tx.commit();
		}
		catch(RuntimeException e)
		{
			e.printStackTrace();
			
			if(tx != null)
				tx.rollback();
			
			// the person has not been added, so return false.
			saved = false;
		}
		finally
		{
			if(session != null)
			{
				session.close();
			}
		}	
			
		return saved;
	}

}
